package com.websuites.core.response;

import java.math.BigDecimal;
import java.util.Comparator;
import java.util.Map;

@SuppressWarnings("unchecked")
public class Sort implements Comparator
{
	private String sSortOrder;
	private String sSortColumn;

	public Sort(String sSortOrder, String sSortColumn)
	{
		this.sSortOrder = sSortOrder;
		this.sSortColumn = sSortColumn;
	}
	
	public int compare(Object row1, Object row2) 
	{
		Map mapRow1 = (Map)row1;
		Map mapRow2 = (Map)row2;
		
		Object oCol1 = mapRow1.get(sSortColumn);
		Object oCol2 = mapRow2.get(sSortColumn);
		
		if (sSortOrder.equalsIgnoreCase("asc"))
		{
			if (oCol1 == null && oCol2 == null)
			{
				return -1;
			}
			else if (oCol1 == null)
			{
				return -1;
			}
			else if (oCol2 == null)
			{
				return 1;
			}
			else
			{
				if (oCol1.getClass().getName().equalsIgnoreCase("java.math.BigDecimal"))
				{
					return ((BigDecimal)oCol1).compareTo((BigDecimal)oCol2);
				}
				if (oCol1.getClass().getName().equalsIgnoreCase("java.lang.Integer"))
				{
					return ((Integer)oCol1).compareTo((Integer)oCol2);
				}
				if (oCol1.getClass().getName().equalsIgnoreCase("java.lang.Number"))
				{
					return ((Integer)oCol1).compareTo((Integer)oCol2);
				}
				if (oCol1.getClass().getName().equalsIgnoreCase("java.lang.Double"))
				{
					return ((Double)oCol1).compareTo((Double)oCol2);
				}
				if (oCol1.getClass().getName().equalsIgnoreCase("java.lang.Boolean"))
				{
					return ((Boolean)oCol1).booleanValue() == true ? 1 : -1;
				}
				else
				{
					return oCol1.toString().compareTo(oCol2.toString());					
				}
			}
		}
		else
		{
			if (oCol1 == null && oCol2 == null)
			{
				return 1;
			}
			else if (oCol1 == null)
			{
				return 1;
			}
			else if (oCol2 == null)
			{
				return -1;
			}
			else
			{
				if (oCol1.getClass().getName().equalsIgnoreCase("java.math.BigDecimal"))
				{
					return ((BigDecimal)oCol2).compareTo((BigDecimal)oCol1);
				}
				if (oCol1.getClass().getName().equalsIgnoreCase("java.lang.Integer"))
				{
					return ((Integer)oCol2).compareTo((Integer)oCol1);
				}
				if (oCol1.getClass().getName().equalsIgnoreCase("java.lang.Number"))
				{
					return ((Integer)oCol2).compareTo((Integer)oCol1);
				}
				if (oCol1.getClass().getName().equalsIgnoreCase("java.lang.Double"))
				{
					return ((Double)oCol2).compareTo((Double)oCol1);
				}
				if (oCol1.getClass().getName().equalsIgnoreCase("java.lang.Boolean"))
				{
					return ((Boolean)oCol2).booleanValue() == true ? 1 : -1;
				}
				else
				{
					return oCol2.toString().compareTo(oCol1.toString());					
				}
			}
		}
	}
}
